﻿/*
教室的墙上挂满了气球，五颜六色，小朋友们非常喜欢。刚一下课，小朋友们就打算去抢这些气球。每个气球在墙上都有一定的高度，只有当小朋友跳起来时，手能够到的高度大于等于气球的高度，小朋友才能摘到这个气球。为了公平起见，老师让跳的低的小朋友先摘，跳的高的小朋友后摘。小朋友都很贪心，每个小朋友在摘气球的时候都会把自己能摘的气球都摘掉。很巧的是，小朋友们跳起来手能够着的高度都不一样，这样就不会有跳起来后高度相同的小朋友之间发生争执了
输入格式
	第一行输入两个空格分隔的整数𝑛,𝑚(1≤𝑛, 𝑚≤ 10^5)，其中𝑛表示小朋友的数量，𝑚表示墙上气球的数量
	第二行输入𝑛个正整数（每两个整数之间用空格隔开），第𝑖个数为 𝑎_𝑖 (1 ≤ 𝑎_𝑖  ≤ 10^9)，表示第𝑖个小朋友跳起来手能够着的高度为 𝑎_𝑖
	第三行输入𝑚个正整数（每两个整数之间用空格隔开），第𝑖个数为 ℎ_𝑖 (1 ≤ ℎ_𝑖  ≤ 10^9)，表示第𝑖个气球的高度为ℎ_𝑖  --> 注意，此处气球高度为乱序
输出格式
	输出一共n行，每行一个整数。第 i 行表示第 i 个小朋友摘到的气球数量
样例输入
	10 10
	1 2 3 4 5 6 7 8 9 10
	3 1 4 6 7 8 9 9 4 12
样例输出
	1 0 1 2 0 1 1 1 2 0   --> 竖着输出
*/
#include <iostream>
#include <algorithm>

using namespace std;

struct Stu {
	int a;    // 小朋友跳起来的高度
	int id;	  // 小朋友编号
}S[100005];
// Stu S[];

int ans[100005];
int h[100005];  // 每个气球的高度
int n, m;
int p;  // 摘到了第 p 个气球

// 按照升高升序排序
bool cmp(Stu& aa, Stu& bb) {
	return aa.a < bb.a;
}

int main()
{
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> S[i].a;
		S[i].id = i;
	}

	// 得到气球高度
	for (int i = 0; i < m; i++) {
		cin >> h[i];
	}

	sort(h, h + m);
	sort(S, S+n, cmp);

	// 开始摘气球
	for (int i = 0; i < n; i++) {
		while (p < m && h[p] <= S[i].a) {
			ans[S[i].id]++;
			p++;
		}	
	}

	for (int i = 0; i < n; i++) {
		cout << ans[i] << endl;
	}
	
	return 0;
}